package com.example.apitesttool.service;

import dev.langchain4j.agent.tool.Tool;
import io.swagger.v3.oas.models.OpenAPI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Optional;

/**
 * 文档管理工具类
 * 
 * 为大模型提供 OpenAPI 文档管理能力的工具集合。
 * 这些工具允许 AI Agent 查询、管理和操作已上传的 OpenAPI 文档。
 * 
 * 特性：
 * - 查询文档信息
 * - 切换活跃文档
 * - 删除文档
 * - 获取文档统计信息
 * 
 * @author liuxy
 * @version 1.0.0
 */
@Component
public class DocumentManagementTools {
    
    @Autowired
    private OpenApiDocumentManager documentManager;
    
    @Autowired
    private DocumentVectorizationService documentVectorizationService;

    @Tool("获取所有已上传的 OpenAPI 文档列表和详细信息。")
    public String getAllDocuments() {
        return documentManager.getDocumentsAsString();
    }

    @Tool("获取当前活跃的 OpenAPI 文档信息。")
    public String getCurrentActiveDocument() {
        Optional<String> activeId = documentManager.getCurrentActiveDocumentId();
        if (!activeId.isPresent()) {
            return "当前没有活跃的 OpenAPI 文档。请先上传一个文档。";
        }
        
        Optional<OpenApiDocumentManager.DocumentMetadata> metadata = 
            documentManager.getDocumentMetadata(activeId.get());
        
        if (!metadata.isPresent()) {
            return "无法获取当前活跃文档的信息。";
        }
        
        OpenApiDocumentManager.DocumentMetadata meta = metadata.get();
        StringBuilder info = new StringBuilder();
        info.append("当前活跃文档信息:\n");
        info.append("- ID: ").append(meta.getId()).append("\n");
        info.append("- 标题: ").append(meta.getTitle()).append("\n");
        info.append("- 版本: ").append(meta.getVersion()).append("\n");
        info.append("- 描述: ").append(meta.getDescription()).append("\n");
        info.append("- 接口数量: ").append(meta.getPathCount()).append(" 个路径, ")
            .append(meta.getOperationCount()).append(" 个操作\n");
        info.append("- 上传时间: ").append(meta.getUploadTime()).append("\n");
        
        return info.toString();
    }

    @Tool("切换到指定 ID 的文档作为当前活跃文档。")
    public String setActiveDocument(String documentId) {
        if (documentId == null || documentId.trim().isEmpty()) {
            return "文档 ID 不能为空。";
        }
        
        boolean success = documentManager.setCurrentActiveDocument(documentId.trim());
        if (success) {
            return "已成功切换到文档: " + documentId.trim();
        } else {
            return "切换失败。文档 ID '" + documentId.trim() + "' 不存在。请使用 getAllDocuments 工具查看可用的文档。";
        }
    }

    @Tool("删除指定 ID 的 OpenAPI 文档。注意：此操作不可撤销。")
    public String removeDocument(String documentId) {
        if (documentId == null || documentId.trim().isEmpty()) {
            return "文档 ID 不能为空。";
        }
        
        String trimmedId = documentId.trim();
        
        // 检查文档是否存在
        if (!documentManager.hasDocument(trimmedId)) {
            return "文档 ID '" + trimmedId + "' 不存在。请使用 getAllDocuments 工具查看可用的文档。";
        }
        
        // 获取文档信息用于确认消息
        Optional<OpenApiDocumentManager.DocumentMetadata> metadata = 
            documentManager.getDocumentMetadata(trimmedId);
        String documentTitle = metadata.isPresent() ? metadata.get().getTitle() : "未知";
        
        // 删除向量数据
        try {
            documentVectorizationService.removeDocumentVectors(trimmedId);
        } catch (Exception e) {
            // 向量删除失败不影响文档删除
        }
        
        boolean success = documentManager.removeDocument(trimmedId);
        if (success) {
            return "已成功删除文档: " + trimmedId + " (" + documentTitle + ")";
        } else {
            return "删除文档失败: " + trimmedId;
        }
    }

    @Tool("获取系统中文档的统计信息。")
    public String getDocumentStatistics() {
        int totalDocs = documentManager.getDocumentCount();
        Optional<String> activeId = documentManager.getCurrentActiveDocumentId();
        
        StringBuilder stats = new StringBuilder();
        stats.append("文档统计信息:\n");
        stats.append("- 总文档数量: ").append(totalDocs).append("\n");
        stats.append("- 当前活跃文档: ");
        
        if (activeId.isPresent()) {
            stats.append(activeId.get()).append("\n");
        } else {
            stats.append("无\n");
        }
        
        if (totalDocs > 0) {
            stats.append("\n使用 getAllDocuments 工具查看详细的文档列表。");
        } else {
            stats.append("\n系统中还没有上传任何文档。请先上传 OpenAPI/Swagger 文档。");
        }
        
        return stats.toString();
    }

    @Tool("检查指定 ID 的文档是否存在。")
    public String checkDocumentExists(String documentId) {
        if (documentId == null || documentId.trim().isEmpty()) {
            return "文档 ID 不能为空。";
        }
        
        String trimmedId = documentId.trim();
        boolean exists = documentManager.hasDocument(trimmedId);
        
        if (exists) {
            return "文档 '" + trimmedId + "' 存在。";
        } else {
            return "文档 '" + trimmedId + "' 不存在。使用 getAllDocuments 工具查看可用的文档。";
        }
    }
}

